#ifndef FILTROS_H
#define FILTROS_H

#include <opencv/cv.h>
#include "iostream"
#include "vector"

using namespace std;

//* Clase Abstracta filtros

class filtros
{
public:
    filtros();
    void fijarKernel(int a, int b);   //*
    vector <int> obtenerKernel();
    void fijarParametroExtra(int n,int a);
    int obtenerParametroExtra(int n);
    vector <int> obtenerParametrosExtra();
    int obtenerNParametrosExtra();
    string obtenerNombre();

    virtual void filtrar(IplImage *img)=0; //funcion virtual que sera implementada en cada clase
										   // que herede de la clase filtros

protected:
    string nombre; //nombre del filtro
    vector<int> kernel; //vector con las dimensiones del kernel o mascara que usa el filtro (en caso de usar) 
    vector<int> parametroExtra; //vector que contendra los parametros extras que deben ser pasados a algunos filtros
    int nParametrosExtra; // numero de parametros extra que usa el filtro

};

///////////////////////////////////////Filtro de mediana//////////////////////
class filtroMediana : public filtros
{
public:
    filtroMediana();
    void filtrar(IplImage *img);
};

////////////////////////////////////Filtro Gaussiano///////////////////////////
class filtroGauss : public filtros
{
public:
    filtroGauss();
    void filtrar(IplImage *img);
};

////////////////////////////////////////Filtro bilateral///////////////////////
class filtroBilateral : public filtros
{
public:
    filtroBilateral();
    void filtrar(IplImage *img);
};

////////////////////////////////////// Filtro meanShift///////////////////////////
class filtroMeanShift : public filtros
{
public:
    filtroMeanShift();
    void filtrar(IplImage *img);
};


#endif // FILTROS_H
